#include <stdio.h>
// stat函数
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
// opendir函数
#include <sys/types.h>
#include <dirent.h>
// 全局错误码声明所在的头文件
#include <errno.h>  
// strerror函数       
#include <string.h> 


//文件类型说明
/*
DT_BLK  6    This is a block device.   -> 块设备
DT_CHR  2    This is a character device.  -> 字符设备
DT_DIR  4    This is a directory.       -> 目录
DT_FIFO 1    This is a named pipe (FIFO).  -> 管道
DT_LNK  10    This is a symbolic link.    -> 链接
DT_REG  8   This is a regular file.       -> 普通文件
DT_SOCK 12   This is a UNIX domain socket.  -> 套接字文件
DT_UNKNOWN 0 The file type is unknown.   -> 未知类型
*/


int main(int argc, char const *argv[])
{
    
    // 1、打开目录
    DIR* dp = opendir(argv[1]);
    if(dp == NULL)
    {
        printf("PROBLEM: opendir %s error; REASON: %s; LINE: %d;\n", argv[1], strerror(errno), __LINE__);
        return -1;
    }

    // 2、读取目录文件信息，将里面的信息打印出来
    struct dirent *ds_msg_p = NULL;     // 定义目录属性结构体变量
    struct stat info;                   // 定义文件属性结构体变量
    char buf[128] = {0};                // 拼接字符串buf

    while (1)
    {
        // A、读取目录项的信息
        ds_msg_p = readdir(dp);
        if(ds_msg_p == NULL)
           break;

        // B、判断不是"."和".."的信息
        if(strcmp(ds_msg_p->d_name, ".")!=0 && strcmp(ds_msg_p->d_name, "..")!=0)
        {
           
            // 判断是普通文件的信息
            if(ds_msg_p->d_type == DT_REG)  
            {
                // 判断是bmp图片的信息
                char *p = ds_msg_p->d_name;
                p = p+strlen(ds_msg_p->d_name)-4;       // 移位到bmp路径名后面，再往后挪移4个位置，即可知道文件格式是什么
                if(strncmp(p,".bmp", 4) == 0 )
                {
                    printf("ds_msg_p->d_name = %s\n", ds_msg_p->d_name);
                }
            }

        }
    }

    // 3、关闭目录
    closedir(dp);

    return 0;
}
